/*
 * Proxy Plug-in
 * 
 * Features: Times an upload to see if it appear suspiciously fast which might
 * indicate a proxy server or anti-virus suite intercepting the upload. If the
 * upload seems too fast an uploadError event is fired with PROXY error code
 * after the final uploadProgress event.
 * 
 * Adds a SWFUpload setting allowing you to tweak the bytes/s for triggering the
 * error: proxy_detect_threshold : 256000
 * 
 * Adds an UPLOAD_ERROR entry called PROXY: function uploadError(file,
 * errorCode, message) { if (errorCode === SWFUpload.UPLOAD_ERROR.PROXY) {
 * alert("You might have a proxy!"); } }
 */

var SWFUpload;
if (typeof(SWFUpload) === "function") {
	SWFUpload.proxyDetect = {};
	SWFUpload.UPLOAD_ERROR.PROXY = -30300;

	SWFUpload.prototype.initSettings = (function(oldInitSettings) {
		return function(userSettings) {
			if (typeof(oldInitSettings) === "function") {
				oldInitSettings.call(this, userSettings);
			}

			this.ensureDefault = function(settingName, defaultValue) {
				this.settings[settingName] = (userSettings[settingName] == undefined)
						? defaultValue
						: userSettings[settingName];
			};

			// List used to keep the speed stats for the files we are tracking
			this.proxyDetectFileStartTimes = {};
			this.proxyDetectSettings = {};

			this.ensureDefault("proxy_detect_threshold", 256000); // Default
																	// is 250 KB
																	// per
																	// second

			this.proxyDetectSettings.user_upload_progress_handler = this.settings.upload_progress_handler;
			this.proxyDetectSettings.user_upload_complete_handler = this.settings.upload_complete_handler;

			this.settings.upload_progress_handler = SWFUpload.proxyDetect.uploadProgressHandler;
			this.settings.upload_complete_handler = SWFUpload.proxyDetect.uploadCompleteHandler;

			delete this.ensureDefault;
		};
	}(SWFUpload.prototype.initSettings));

	SWFUpload.proxyDetect.uploadProgressHandler = function(file, bytesComplete,
			bytesTotal) {
		var ex1 = null, time, differenceMS, bps;
		try {
			if (typeof this.proxyDetectSettings.user_upload_progress_handler === "function") {
				this.proxyDetectSettings.user_upload_progress_handler.call(
						this, file, bytesComplete, bytesTotal);
			}
		} catch (ex1) {
		}

		if (bytesComplete === 0) {
			this.proxyDetectFileStartTimes[file.ID] = new Date();

		} else if (bytesComplete === bytesTotal) {
			try {
				// Calculate the Bps and decide if we should trigger the error
				time = new Date();
				differenceMS = time.getTime()
						- this.proxyDetectFileStartTimes[file.ID].getTime();

				if (differenceMS === 0) {
					differenceMS = 1;
				}

				bps = bytesTotal / (differenceMS * 1000);
				if (bps > parseInt(this.settings.proxy_detect_threshold, 10)) {
					this.queueEvent("upload_error_handler", [file,
									SWFUpload.UPLOAD_ERROR.PROXY, bps]);
				}
			} catch (ex) {
			}
		}

		if (ex1 !== null) {
			throw (ex1);
		}
	};

	SWFUpload.proxyDetect.uploadCompleteHandler = function(file) {
		try {
			delete this.proxyDetectFileStartTimes[file.ID];
		} catch (ex) {
		}

		if (typeof this.proxyDetectSettings.user_upload_progress_handler === "function") {
			return this.proxyDetectSettings.user_upload_progress_handler.call(
					this, file);
		}
	};
}